/* 
 * Copyright 2001-2009 Terracotta, Inc. 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 
 * use this file except in compliance with the License. You may obtain a copy 
 * of the License at 
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0 
 *   
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
 * License for the specific language governing permissions and limitations 
 * under the License.
 * 
 */

package org.quartz.jobs.ee.jms;

import java.lang.reflect.Method;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.quartz.JobDataMap;

/**
 * Utility class that aids in the processing of JMS based jobs and sending of
 * <code>javax.jms.Message</code>
 * 
 * @author Fernando Ribeiro
 * @author Weston M. Price
 */
public final class JmsHelper {
	public static final String CREDENTIALS = "java.naming.security.credentials";

	public static final String INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial";

	public static final String JMS_ACK_MODE = "jms.acknowledge";

	public static final String JMS_CONNECTION_FACTORY_JNDI = "jms.connection.factory";

	public static final String JMS_DESTINATION_JNDI = "jms.destination";

	public static final String JMS_MSG_FACTORY_CLASS_NAME = "jms.message.factory.class.name";

	public static final String JMS_PASSWORD = "jms.password";

	public static final String JMS_USE_TXN = "jms.use.transaction";

	public static final String JMS_USER = "jms.user";

	public static final String PRINCIPAL = "java.naming.security.principal";

	public static final String PROVIDER_URL = "java.naming.provider.url";

	public static void closeResource(final Object resource) {

		if (resource == null)
			return;

		try {
			final Method m = resource.getClass().getMethod("close",
					new Class[0]);

			m.invoke(resource, new Object[0]);
		} catch (final Exception e) {
		}

	}

	public static InitialContext getInitialContext(final JobDataMap dataMap)
			throws NamingException {
		final Hashtable<String, String> params = new Hashtable<String, String>(4);

		final String initialContextFactory = dataMap
				.getString(INITIAL_CONTEXT_FACTORY);

		if (initialContextFactory != null)
			params.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);

		final String providerUrl = dataMap.getString(PROVIDER_URL);

		if (providerUrl != null)
			params.put(Context.PROVIDER_URL, providerUrl);

		final String principal = dataMap.getString(PRINCIPAL);

		if (principal != null)
			params.put(Context.SECURITY_PRINCIPAL, principal);

		final String credentials = dataMap.getString(CREDENTIALS);

		if (credentials != null)
			params.put(Context.SECURITY_CREDENTIALS, credentials);

		if (params.size() == 0)
			return new InitialContext();
		else
			return new InitialContext(params);

	}

	public static JmsMessageFactory getMessageFactory(final String name)
			throws JmsJobException {

		try {
			final Class<?> cls = Class.forName(name);

			final JmsMessageFactory factory = (JmsMessageFactory) cls
					.newInstance();

			return factory;
		} catch (final Exception e) {
			throw new JmsJobException(e.getMessage(), e);
		}

	}

	public static boolean isDestinationSecure(final JobDataMap dataMap) {
		return ((dataMap.getString(JmsHelper.JMS_USER) != null) && (dataMap
				.getString(JmsHelper.JMS_PASSWORD) != null));
	}

	public static boolean useTransaction(final JobDataMap dataMap) {
		return dataMap.getBoolean(JMS_USE_TXN);
	}

	private JmsHelper() {
	}

}